package com.example.demo.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.example.demo.base.CommonResult;
import com.example.demo.dto.LoginParam;
import com.example.demo.service.AuthService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 登录测试
 */
@Api(tags = "登录模块")
@RestController
@RequestMapping("/acc/")
public class LoginController{

    @Autowired
    private AuthService authService;

    // 测试登录  ---- http://localhost:8081/acc/doLogin?name=zhang&pwd=123456
   /* @ApiImplicitParams({
            @ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query"),
            @ApiImplicitParam(name="pwd",value="密码",dataType="string", paramType = "query")})*/
    @ApiOperation(value = "登录系统")
    @PostMapping("doLogin")
    public CommonResult doLogin(@RequestBody @Validated LoginParam param) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        return CommonResult.data(authService.login(param));
    }

    // 查询登录状态  ---- http://localhost:8081/acc/isLogin
    @ApiOperation(value="是否登录")
    @PostMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登录：" + StpUtil.isLogin());
    }

    // 查询 Token 信息  ---- http://localhost:8081/acc/tokenInfo
    @ApiOperation(value="查询token信息")
    @PostMapping("tokenInfo")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }

    // 测试注销  ---- http://localhost:8081/acc/logout
    @ApiOperation(value="登出注销")
    @PostMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        //StpUtil.logout(10001);
        return SaResult.ok();
    }


    // 踢人下线
    @ApiOperation(value="踢人下线")
    @PostMapping("kickout")
    public SaResult kickout() {
        StpUtil.kickout(10001);
        return SaResult.ok();
    }

    // 检验当前会话是否已经登录, 如果未登录，则抛出异常：`NotLoginException`
    @ApiOperation(value="检查登录情况")
    @PostMapping("checkLogin")
    public SaResult checkLogin() {
        StpUtil.checkLogin();
        return SaResult.ok();
    }

    // 获取当前会话账号id, 如果未登录，则抛出异常：`NotLoginException`
    @ApiOperation(value="获取登录ID")
    @PostMapping("getLoginId")
    public SaResult getLoginId() {
        return SaResult.data(StpUtil.getLoginIdDefaultNull());
    }

    @ApiOperation(value="获取登录用户角色")
    @SaIgnore
    @PostMapping("getRoleList")
    public SaResult getRoleList() {
        // 获取：当前账号所拥有的角色集合
        StpUtil.getRoleList();
        // 判断：当前账号是否拥有指定角色, 返回 true 或 false
        StpUtil.hasRole("super-admin");
        // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
        //StpUtil.checkRole("super-admin");
        // 校验：当前账号是否含有指定角色标识 [指定多个，必须全部验证通过]
        //StpUtil.checkRoleAnd("super-admin", "shop-admin");
        // 校验：当前账号是否含有指定角色标识 [指定多个，只要其一验证通过即可]
        //StpUtil.checkRoleOr("super-admin", "shop-admin");
        return SaResult.data(StpUtil.getRoleList());
    }

    @ApiOperation(value="获取登录用户权限")
    @SaIgnore
    @PostMapping("getPermissionList")
    public SaResult getPermissionList() {
        // 获取：当前账号所拥有的权限集合
        StpUtil.getPermissionList();
        // 判断：当前账号是否含有指定权限, 返回 true 或 false
        StpUtil.hasPermission("user.add");
        // 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
        //StpUtil.checkPermission("user.add");
        // 校验：当前账号是否含有指定权限 [指定多个，必须全部验证通过]
        //StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");
        // 校验：当前账号是否含有指定权限 [指定多个，只要其一验证通过即可]
        //StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");
        return SaResult.data(StpUtil.getPermissionList());
    }

}